昨天我們學了 git fetch
,它就像情報員一樣,低調地把遠端最新資訊帶回來,但不會動到你的本地分支。
那如果我們希望「直接同步遠端改動,馬上就能用」呢?
這時候,就要靠今天的主角:git pull
。
git pull
是什麼?你可以把它理解成這個公式:
git pull = git fetch + git merge
也就是說,它會先去遠端抓取更新,然後直接把這些更新合併到你目前所在的分支。
👉 簡單粗暴,一步到位。
# 從 origin 的 main 分支抓取更新,並合併到本地
git pull origin main
如果之前已經用 git push -u origin main
建立追蹤關係,那以後只要:
git pull
就能自動拉取對應的遠端分支。
預設情況下,git pull
使用 merge 合併。這會產生額外的 merge commit,導致歷史看起來比較分叉。
若想要保持歷史乾淨,可以改用 rebase:
git pull --rebase
這樣 Git 會把你的本地提交「重新套用」在遠端分支之上,歷史就會是一條直線。
Merge(預設)
遠端 main: A --- B --- C
本地 main: D --- E
git pull (merge)
結果:
A --- B --- C --- M
\
D --- E
M = merge commit
M
。Rebase(線性歷史)
遠端 main: A --- B --- C
本地 main: D --- E
git pull --rebase
結果:
A --- B --- C --- D' --- E'
D', E' = 重新套用的提交
有時候遠端和本地的修改衝突,git pull
就會中斷並提示:
CONFLICT (content): Merge conflict in example.txt
Automatic merge failed; fix conflicts and then commit the result.
解決流程:
打開衝突檔案,找到標記:
<<<<<<< HEAD
本地內容
=======
遠端內容
>>>>>>> origin/main
手動整合正確內容。
標記檔案為已解決:
git add example.txt
處理完檔案衝突後,使用 git add
標記此檔案已解決。
提交合併完成:
git commit
合併時發生衝突是很正常的,不必慌張。先理解差異,再冷靜解決衝突,就能順利完成合併。
git fetch
vs git pull
指令 | 行為 | 優點 | 缺點 | 適用情境 |
---|---|---|---|---|
git fetch |
只抓遠端更新,不改變目前分支 | 安全、不會動到工作分支;可以先觀察更新 | 需要再手動 merge 或 rebase 才能同步 |
想先看清楚遠端變更、避免意外合併 |
git pull |
先 fetch,並自動合併到目前分支 | 快速同步,一步完成 | 可能產生 merge commit,歷史比較雜 | 日常開發快速更新,或多人協作需要立即同步 |
git fetch
,再手動決定 merge 或 rebase。rebase
,有些則習慣 merge,請依照專案規則來。安全派:
先 git fetch
,再 git log
/ git diff
看差異,決定要不要合併。
效率派:
直接 git pull
,快速同步遠端。
乾淨歷史派:
使用 git pull --rebase
,避免產生多餘 merge commit。
git pull
來同步遠端更新。git pull --rebase
,比較歷史紀錄的差異。git pull
= git fetch
+ git merge
git pull --rebase
。👉 如果說 git fetch
是低調情報員,那 git pull
就是「帶回情報並馬上實施的行動小隊」。